home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 049a / slhea201.zip / MAKEHEAD.C < prev    next >
C/C++ Source or Header  |  1991-06-09  |  14KB  |  511 lines

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "string.h"
  4. #include "ctype.h"
  5. #include "dos.h"
  6. #include "sys/stat.h"
  7.  
  8. #define FALSE 0
  9. #define TRUE 1
  10.  
  11. /*******************************************************************/
  12. /*                                                                 */
  13. /*       Create an header for a reply to a mail in SLMR 2.0        */
  14. /*                        and MegaMail 2.1                         */
  15. /*                        By  Serge Delbono                        */
  16. /*                   Version 2.01 - 8 june 1991                    */
  17. /*                   Dedicated to public domain                    */
  18. /*                                                                 */
  19. /*******************************************************************/
  20. // BC ++ 2.0
  21. /************************************************/
  22. /*Use of compiling define :                     */
  23. /*-DFRENCH  : french language (default)         */
  24. /*-DENGLISH : english language                  */
  25. /************************************************/
  26. #ifndef ENGLISH
  27. #define FRENCH
  28. #endif
  29.  
  30. /*
  31. Permet de lire un header du style :
  32. (header SLMR)
  33.  123456789 123456789 123456789 123456789 123456789 123456789 123456789
  34. ===========================================================================
  35.  BBS: The Plywood PC
  36. Date: 05-23-91 (02:00)             Number: 1
  37. From: GREG HEWGILL                 Refer#: NONE
  38.   To: ALL                           Recvd: NO
  39. Subj: Welcome to SLMR 2.0!           Conf: (0) Welcome!
  40. ---------------------------------------------------------------------------
  41.  
  42. et :
  43. (header MegaMail)
  44. 0         1         2         3         4         5         6
  45.  123456789 123456789 123456789 123456789 123456789 123456789 123456789
  46. Echo Flag : N       Permanent: N       Export: N      Personal Read: Y
  47.  
  48.  BBS: ALF             Conference: MAIN            Imported:  5/25/1991
  49.   To: SERGE DELBONO                   Num: 160        Date:  5/24/1991
  50. From: ATTILA ALTAN                     Re: 0          Time: 10:08 pm
  51. Subj: How are you'yau d'poele ?      Prvt: N          Read: N
  52.  
  53. */
  54.  
  55. char buf [100] ; // buffer de lecture et formatage
  56. char bbs[26] ;    // Nom du serveur. BBS name
  57. char date[26] ;    // date du message (MM-JJ-AA) ou (MM/JJ/AAAA)
  58. char from [26] ;  // Emetteur
  59. char to [26] ;    // receveur
  60. char subj [26] ;  // Sujet
  61.  
  62. char datei[26] ; // date format national/date national format
  63. char datel[26] ; // date en lettre (Samedi 1 juin 1991) / date in letters
  64. char conf [26] ; // Conférence (seulement SLMR) / conf name (only SLMR)
  65. char format [1024] ;
  66. char *pform ;   // Pointe vers le format du header / ptr to format
  67.  
  68. int eoinput = FALSE ;
  69.  
  70. #ifdef FRENCH
  71. char *month[] = {
  72.         "janvier",
  73.         "février",
  74.         "mars",
  75.         "avril",
  76.         "mai",
  77.         "juin",
  78.         "juillet",
  79.         "aout",
  80.         "septembre",
  81.         "octobre",
  82.         "novembre",
  83.         "décembre",
  84.         } ;
  85. char *week [] = {
  86.         "dimanche",
  87.         "lundi",
  88.         "mardi",
  89.         "mercredi",
  90.         "jeudi",
  91.         "vendredi",
  92.         "samedi",
  93.         } ;
  94. #endif
  95. #ifdef ENGLISH
  96. char *month[] = {
  97.         "january",
  98.         "february",
  99.         "march",
  100.         "april",
  101.         "may",
  102.         "june",
  103.         "july",
  104.         "august",
  105.         "september",
  106.         "october",
  107.         "november",
  108.         "décember",
  109.         } ;
  110. char *week [] = {
  111.         "sunday",
  112.         "monday",
  113.         "tuesday",
  114.         "wednesday",
  115.         "thursday",
  116.         "friday",
  117.         "saturday",
  118.         } ;
  119. #endif
  120.  
  121. struct COUNTRY pays ;
  122.  
  123. // Réponse par défaut / default reply
  124. char stdform[] =
  125. #ifdef FRENCH
  126.  "Cher $F,\nDans un message adressé à $T,"
  127. "vous écriviez, à propos de \"$S\":\n\n$Z"
  128. "\nUn ami qui vous veut du bien, le $l" ;
  129. #endif
  130.  
  131. #ifdef ENGLISH
  132. "Dear $F,\nIn a message to $T,"
  133. "you wrote about \"$S\":\n\n$Z"
  134. "\nA friend of yours... $l" ;
  135. #endif
  136.  
  137. /***************************************************/
  138. /*  Lit une ligne et affiche eventuellement "EOF"  */
  139. /*                si fin de fichier                */
  140. /***************************************************/
  141.  
  142. int getline(int i)
  143. {
  144.   memset (buf,0, 80) ;
  145.   if (eoinput)
  146.     return TRUE ;
  147.  
  148.   if (gets(buf)==NULL){
  149. #ifdef FRENCH
  150.     fprintf (stderr, "Fin de message ligne %d\n",i) ;
  151. #endif
  152. #ifdef ENGLISH
  153.     fprintf (stderr, "End of message line %d\n",i) ;
  154. #endif
  155.     eoinput = TRUE ;
  156.     return TRUE ;
  157.   } /* fin if */
  158.   return FALSE ;
  159. }
  160.  
  161. /***********************************/
  162. /*                                 */
  163. /*   rempli un item si il est la   */
  164. /*   fill an item (if it's here)   */
  165. /*                                 */
  166. /***********************************/
  167.  
  168.  
  169. void remplir (char *id, char *var)
  170. {
  171.   int ok=FALSE ;
  172.   int i ;
  173.   int lim ;
  174.   if (memcmp(id, buf,6)==0){
  175.         memset (var,0,26) ;
  176.         strncpy (var, buf+6,25) ;
  177.         ok = TRUE ;
  178.   } else
  179.   if (memcmp (id, buf+54, 6)==0) {
  180.     memset (var,0,26) ;
  181.     strncpy (var, buf+60, 25) ;
  182.         ok = TRUE ;
  183.   } else if (memcmp (id, buf+37, 6) == 0) {
  184.     memset (var,0,26) ;
  185.     strncpy (var, buf+43, 25) ;
  186.         ok = TRUE ;
  187.   } /* fin if */
  188.   if (!ok) return ;
  189.  
  190. // ?#@\~# de Megamail
  191.   if ((var==bbs) &&( memcmp (buf+22,"Conference",10)==0))
  192.     lim = 14 ;
  193.   else
  194.     lim = 25 ;  // bof !
  195.  
  196.   var [lim] = 0 ;
  197.   for (i=lim-1;i>0 ;i-- ){
  198.       if (var[i] == ' ')
  199.         var[i]= '\0' ;
  200.       else
  201.         if (var[i]) break ;
  202.   } /* fin for */
  203.  
  204. }
  205.  
  206. /***********************************************************/
  207. /*                                                         */
  208. /*   Met un nom en minuscule, avec majuscule la première   */
  209. /*                  lettre de chaque mot                   */
  210. /*                                                         */
  211. /***********************************************************/
  212.  
  213. void do_minus (char *buf)
  214. {
  215.   int c ;
  216.   int tom = FALSE ;
  217.   while ((c=*buf)!=0){
  218.         if (tom){
  219.           c=tolower (c) ;
  220.         } else {
  221.           c=toupper(c) ;
  222.         } /* fin if */
  223.         if (!isalnum(c))
  224.           tom = FALSE ;
  225.         else tom = TRUE ;
  226.         *buf++ = c ;
  227.  
  228.   } /* fin while */
  229. }
  230.  
  231. /***********************************/
  232. /*                                 */
  233. /*  calcul le jour de la semaine   */
  234. /* compute day of week             */
  235. /*                                 */
  236. /***********************************/
  237. int semaine (int jj,int mm,int aaaa)
  238. //             day   month   year
  239. {
  240.   int siecle, aa ; // century and year in century
  241.   long magic ;
  242.   if (mm<=2){ // Janvier, fevrier ! gag !
  243.         mm += 12 ;
  244.         aaaa-- ;
  245.   } /* fin if */
  246.   mm -= 2 ;
  247.   siecle = aaaa/100 ;
  248.   aa = aaaa % 100 ;
  249.  
  250.   magic = siecle/4 + aa/4 ;
  251.   magic = magic+(13*mm-1)/5 ;
  252.  
  253.   magic = magic + aa + jj -2*siecle;
  254.   return (magic % 7) ;
  255. }
  256. /*******************************************/
  257. /*                                         */
  258. /*  Determination d'une date format court  */
  259. /*              (JJ/MM/AAAA)               */
  260. /*    get a date in short format           */
  261. /*              (MM-DD-YYYY)               */
  262. /*                                         */
  263. /*******************************************/
  264.  
  265. void datecourte (int jour,int mois,int an,char *champs)
  266. //                  day     month   year     field to fill
  267. {
  268.         switch (pays.co_date) {
  269.                 case 0 : /* US */
  270.                         sprintf (champs,"%02d%s%02d%s%04d", mois,
  271.                         pays.co_dtsep, jour, pays.co_dtsep, an) ;
  272.                         break ;
  273.                 case 1 : /* france */
  274.                         sprintf (champs,"%02d%s%02d%s%04d", jour,
  275.                         pays.co_dtsep, mois, pays.co_dtsep, an) ;
  276.                         break ;
  277.                 case 2 : /* japan ? */
  278.                         sprintf (champs,"%04d%s%02d%s%02d", an,
  279.                         pays.co_dtsep, mois, pays.co_dtsep, jour) ;
  280.                         break ;
  281.         }
  282. }
  283.  
  284. /***************************************************/
  285. /*                                                 */
  286. /*     determination d'une date au format long     */
  287. /*               (lundi 3 juin 1991)               */
  288. /*     get a date in long format                   */
  289. /*               (monday, june 3, 1991)            */
  290. /*                                                 */
  291. /***************************************************/
  292.  
  293. void datelongue (int jour,int mois,int an,char *champ)
  294. {
  295. // determination du jour de la semaine
  296.         int jsem = semaine(jour,mois,an) ;
  297. #ifdef FRENCH
  298.         sprintf (champ,"%s %d %s %d", week[jsem],jour, month[mois-1], an) ;
  299. #endif
  300. #ifdef ENGLISH
  301.         sprintf (champ,"%s, %s %d, %d", week[jsem],month[mois-1], jour, an) ;
  302. #endif
  303. }
  304.  
  305. /***********************************/
  306. /*Put header on stdout :           */
  307. /*pbuf : begin of header format    */
  308. /*print : Flag if real printing    */
  309. /*stop on EOF or "$Z"              */
  310. /***********************************/
  311.  
  312. char *make_head(char *pbuf,int print)
  313. {
  314.   char c ;
  315.   struct date da ;
  316.   static char temp [40] ;
  317.   int dollarz = FALSE ;
  318.  
  319.   getdate (&da) ;
  320.   while (((c=*pbuf++) != 0) && !dollarz){
  321.    if (c!='$'){
  322.      if (print) putchar(c) ;
  323.    } else {
  324.      c=*pbuf++ ;
  325.      switch (c) {
  326.        case 0:
  327.          pbuf-- ;
  328.          break;
  329.  
  330.        case 'F': case 'f' :
  331.          if (print) printf ("%s",from) ;
  332.          break;
  333.  
  334.        case 'T': case 't' :
  335.          if (print) printf ("%s",to) ;
  336.          break;
  337.  
  338.        case 'D':
  339.          if (print) printf ("%s",date) ;
  340.          break;
  341.  
  342.        case 'L':
  343.          if (print) printf ("%s", datel) ;
  344.          break;
  345.  
  346.        case 'I': case 'i' :
  347.          if (print) printf ("%s", datei) ;
  348.          break;
  349.  
  350.  
  351.  
  352.        case 'S': case 's' :
  353.          if (print) printf ("%s",subj) ;
  354.          break;
  355.  
  356.        case 'B': case 'b' :
  357.          if (print) printf ("%s",bbs) ;
  358.          break;
  359.  
  360.        case 'C': case 'c' :
  361.          if (print) printf ("%s",conf) ;
  362.          break;
  363.  
  364.  
  365.        case 'Z': case 'z' :
  366.          dollarz = TRUE ;
  367.          break;
  368.  
  369.        case 'd' :
  370.          if (print) {
  371.              datecourte (da.da_day, da.da_mon, da.da_year,temp) ;
  372.              printf ("%s",temp) ;
  373.          }
  374.          break ;
  375.  
  376.        case 'l':
  377.          if (print) {
  378.             datelongue (da.da_day, da.da_mon, da.da_year,temp) ;
  379.             printf ("%s",temp) ;
  380.          }
  381.          break ;
  382.  
  383.        default:
  384.         putchar (c) ;
  385.          ;
  386.      } /* fin switch */
  387.    } /* fin if */
  388.  } /* fin while */
  389.  
  390.  if (c){
  391.    return pbuf ;
  392.  } else {
  393.    return NULL ;
  394.  } /* fin if */
  395. }
  396.  
  397. /***********************************/
  398. /*                                 */
  399. /*         - MAIN ROUTINE-         */
  400. /*                                 */
  401. /***********************************/
  402. void main (argc, argv)
  403.     int argc;     /* nb d' arguments */
  404.     char *argv[]; /* tableau d'arguments */
  405. {
  406.   char c ;
  407.   int i ;
  408.   char *pbuf ;
  409.   struct stat st ;
  410. #ifdef FRENCH
  411.   fputs("Création header pour SLMR (TM) et Megamail (TM) V2.01\n",stderr) ;
  412.   fputs("Par Serge Delbono. Copyright (c) S.Delbono 1991\n",stderr) ;
  413.   fputs("Avec la collaboration de Eric Soudy\n",stderr) ;
  414.   fputs("Dédié au domaine public\n",stderr) ;
  415.   fputs("Usage :\n",stderr) ;
  416.   fputs("MAKEHEAD [<fichier orig] [fichier header] >fichier destination\n",
  417.         stderr) ;
  418. #endif
  419.  
  420. #ifdef ENGLISH
  421.   fputs("Creating header for SLMR (TM) and Megamail (TM) V2.01\n",stderr) ;
  422.   fputs("By Serge Delbono. Copyright (c) S.Delbono 1991\n",stderr) ;
  423.   fputs("With a little help of Eric Soudy\n",stderr) ;
  424.   fputs("Dedicated to public domain\n",stderr) ;
  425.   fputs("Usage :\n",stderr) ;
  426.   fputs("MAKEHEAD [<orig-file] [header file] >dest. file\n",
  427.         stderr) ;
  428. #endif
  429.  
  430.   fstat (fileno (stdin),&st) ;
  431.   if (st.st_mode & S_IFCHR){ // stdin redirigé ?
  432.         eoinput = TRUE ;
  433.   } /* fin if */
  434.  
  435.   bbs[0] = from [0] = to [0] = date[0] = subj [0] = 0 ;
  436.   for (i = 1;i <=7 ;i++ ){
  437.       if (getline (i))
  438.         break ;
  439.       remplir (" BBS: ",bbs) ;
  440.       remplir ("  To: ",to) ;
  441.       remplir ("From: ",from) ;
  442.       remplir ("Subj: ",subj) ;
  443.       remplir ("Date: ",date) ;
  444.       remplir ("Conf: ",conf) ;
  445.       if ((date[0]!='\0') && (bbs[0]!='\0')
  446.        && (  to[0]!='\0') && (from[0]!='\0') && (subj[0]!='\0'))
  447.                 break ;
  448.   } /* fin for */
  449.  
  450. // Ici on a tout
  451.    do_minus(from) ; do_minus(to) ;
  452. // Calcul des dates en format "human readable"
  453.    country (0,&pays) ;
  454.    if (date[0] != '\0')
  455.    {
  456.         int jour, mois, an, jsem ;
  457.         jour = atoi (date+3) ;
  458.         mois = atoi (date) ;
  459.         an   = atoi (date+6) ;
  460.         if (an < 100) {
  461.                 if (an >80) an = an + 1900 ; else an = an + 2000 ;
  462. // ca ne marchera plus après 2080 (je serai probablement mort)
  463.         }
  464.  
  465.         datecourte (jour,mois,an,datei) ;
  466.         datelongue (jour,mois,an,datel) ;
  467.    }
  468.  
  469. // Lecture du format :
  470.   pform = stdform ;
  471.   if (argc >1){
  472.     FILE *fi ;
  473.     pbuf = format ;
  474.     fi = fopen (argv[1],"r") ;
  475.     if (fi==NULL){
  476. #ifdef FRENCH
  477.       fprintf (stderr,"erreur lecture %s\n",argv[1]) ;
  478. #endif
  479. #ifdef ENGLISH
  480.       fprintf (stderr,"error reading %s\n",argv[1]) ;
  481. #endif
  482.  
  483.     } else {
  484.       pform = format ;
  485.       while ((c= getc (fi))!=EOF )
  486.         *pbuf++ = c ;
  487.  
  488.       *pbuf='\0' ;
  489.       fclose (fi) ;
  490.     } /* fin if */
  491.   } /* fin if */
  492.  
  493. // On y va...
  494.  pbuf = pform ;
  495.  
  496.  pbuf = make_head (pbuf, !eoinput) ;
  497.  
  498. // Recopie du reste du message
  499.  getline (8) ;
  500.  i = 9 ;
  501.  while (!eoinput){
  502.        getline (i++) ;
  503.        puts (buf) ;
  504.  } /* fin while */
  505.  
  506.  if (pbuf)
  507.    make_head(pbuf,TRUE) ;
  508.  
  509.  exit(0) ;
  510. }
  511.